package Comprehensive_01;

import java.util.Arrays;

public class LambdaDemo {
    public static void main(String[] args) {
        /*
            Lambda表达式的注意点：
                1.Lambda表达可以用来简化匿名内部类的书写
                2.Lambda表达式只能简化函数式接口。
                3.函数式接口：
                        有且仅有一个抽象方法的接口叫做函数式接口，接口上方可以加上@FunctionalInterface
         */

        // 1.利用匿名内部类的形式调用下面的方法
        // 调用一个方法时，如果方法的形参时一个接口，那么我们需要传递这个接口的实现类对象
        // 如果实现类对象只要用到一次，就可以使用匿名内部类的形式进行书写
        method(new Swim() {
            @Override
            public void swimming() {
                System.out.println("正在游泳");
            }
        });

        // 2.利用Lambda表达式进行改写
        method(()-> System.out.println("某某某正在游泳"));

        /*
            lambda的省略规则（可推导，可省略）：
                1.参数类型相同可以省略不写
                2.如果只有一个参数，参数类型可以省略，同时()也可以省略。
                3.如果lambda表达式的方法体只有一行。大括号，分号，return可以省略不写，需要同时省略。
         */
        Integer[] arr = {1, 4, 5, 3, 2, 5, 7, 6, 9, 10};
        Arrays.sort(arr, (o1 , o2) -> o2 - o1); // lambda 表达式
        System.out.println(Arrays.toString(arr));
    }

    public static void method(Swim s){
        s.swimming();
    }

    // 函数式接口 有且仅有一个方法
    @FunctionalInterface
    interface Swim{public abstract void swimming();}
}
